#ifndef PLAYER_H
#define PLAYER_H

#include <QObject>
#include "Cards.h"

class Player : public QObject
{
    Q_OBJECT
public:
    enum Role{Lord, Farmer};//角色（地主，农民）
    enum Sex{Man, Woman};//性别
    enum Direction{Left, Right};//头像的显示方向
    enum Type{Robot, User, UnKnow};//玩家的类型（机器人、玩家、未知）

    explicit Player(QObject *parent = nullptr);
    explicit Player(QString name, QObject *parent = nullptr);

    //设置和获取（名字、性别、头像显示方向，玩家类型、分数）
    void setName(QString name);
    QString name();

    void setRole(Role role);
    Role role();

    void setSex(Sex sex);
    Sex sex();

    void setDirection(Direction direction);
    Direction direction();

    void setType(Type type);
    Type type();

    void setScore(int score);
    int score();

    void setIsWin(bool flag);
    bool isWin();

    //提供当前对象的上家/下家对象指针
    void setPrevPlayer(Player* player);
    void setNextPlayer(Player* player);
    Player* prevPlayer();
    Player* nextPlayer();

    //叫地主/抢地主
    void grabLordBet(int point);//1分、2分、3分、0分表示不抢

    //存储扑克牌（发牌的时候）
    void storeDispatchCard(const Card& card);
    void storeDispatchCard(const Cards& cards);

    //得到所有的牌、清空所有的牌、出牌
    Cards cards();
    void clearCards();
    void playHand(Cards& cards);

    //设置出牌的玩家以及待处理的扑克牌
    void setPendingInfo(Player* player, const Cards& cards);
    Player* pendPlayer();
    Cards pendCards();
    //存储出牌玩家对象和打出的牌的函数
    void storePendingInfo(Player* player, Cards& cards);

    //虚函数（叫地主和抢地主、出牌操作）
    virtual void prepareCallLord();
    virtual void preparePlayHand();
    virtual void thinkCallLord();
    virtual void thinkPlayHand();

signals:
    // 通知已经下注了
    void notifyGrabLordBet(Player* player,int bet);
    //通知已经出牌
    void notifyPlayHand(Player* player, Cards& card);
    //通知已经收到地主牌了
    void notifyPickCards(Player* player, const Cards& card);

protected:
    int m_score = 0;//分数
    bool m_isWin = false;//是否获胜了
    Cards m_cards;//存储多张扑克牌（玩家手中的牌）
    Cards m_pendCards;//打出的一次扑克牌（开始轮流判断处理）
    Player* m_pendPlayer = nullptr;//记录打出的一次扑克牌的玩家
    Player* m_prevPlayer = nullptr;//指向上家指针
    Player* m_nextPlayer = nullptr;//指向下家指针
    QString m_name;//名字
    Role m_role;//角色（玩家或地主）
    Sex m_sex;//性别
    Direction m_direction;//头像的显示方位
    Type m_type;//玩家类型（玩家、机器人、未知）
};

#endif // PLAYER_H
